﻿using System.Threading.Tasks;

namespace 处理任务中的异常
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            /*
            //一：在任务线程中处理异常
            //如果仅仅在任务线程中抛出异常，而没有在任务线程中进行捕获处理，那么这个异常会被封装在任务对象中，并且不会直接影响主线程的执行。也不会有任何异常信息输出到控制台。
            //当主线程尝试访问任务的结果或者等待任务完成时（例如通过调用 task.Wait() 或 await task），这个封装的异常才会被重新抛出，从而影响主线程。
            //如果在任务线程中捕获并处理了异常，那么控制台可以收到自定义的异常处理信息，而不会影响主线程的执行。
            //如果使用的是Thread，那么只能在任务线程中处理异常，无法在主线程中捕获任务线程的异常。
            Task task = Task.Run(async () =>
            {
                await Task.Delay(2000);
                //try
                {
                    throw new Exception("任务线程中的异常1");
                    //throw null;
                }
                //catch (Exception ex)
                //{
                //    Console.WriteLine($"捕获到任务线程中的异常：{ex.Message}");
                //}

            });

            Console.WriteLine("End!");
            //task.Wait();
            await task;
            Console.ReadKey();

            */

            //二：在主线程中处理任务线程的异常

            Task task2 = Task.Run(async () =>
            {
                await Task.Delay(2000);
                throw new Exception("任务线程中的异常2");
            });

            try
            {
                await task2; //等待任务完成，并捕获任务中的异常
            }
            catch (Exception ex)
            {
                Console.WriteLine($"捕获到任务线程中的异常：{ex.Message}");
            }

            Console.ReadKey();
        }
    }
}
